//+------------------------------------------------------------------+
//|                                                    IComparer.mqh |
//|                             Copyright 2000-2025, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| IComparer<T> 泛型接口：MQL5 外部比较器标准接口                    |
//| 核心定位：定义一个独立的外部比较器接口，用于比较两个同类型对象的大小关系， |
//|           与对象自身实现的比较逻辑（IComparable<T>）分离，支持同一类型的 |
//|           多种比较规则（如订单可按时间、盈利、手数等不同维度排序）       |
//| 泛型特性：通过模板参数 <T> 适配任意数据类型，确保比较操作的类型安全性，   |
//|           仅允许同类型对象之间的比较（如 T=订单类型时，只能比较两个订单） |
//| 核心价值：作为“外部比较策略”，实现“比较逻辑与对象本身解耦”，同一对象可根据 |
//|           场景切换不同比较规则（如同一批订单，在报表中按盈利排序，在日志中按时间排序），|
//|           避免修改对象类即可扩展比较维度，符合“开闭原则”               |
//| 与 IComparable<T> 的区别：                                         |
//|           - IComparable<T>：对象“自身”实现比较逻辑（如订单自己知道如何与其他订单比较）；|
//|           - IComparer<T>：外部“比较器”实现比较逻辑（如单独的订单时间比较器、盈利比较器）；|
//|           两者配合可灵活满足各种排序需求                             |
//| 适用场景：所有需要为同一类型提供多种比较规则的 MQL5 程序（EA、指标、脚本），|
//|           尤其适合动态切换排序维度（如用户可在 EA 界面选择订单排序方式）的场景 |
//+------------------------------------------------------------------+
template<typename T>
interface IComparer
  {
   //----------------------------------------------------------------
   // 核心比较接口：定义两个对象的大小关系
   //----------------------------------------------------------------
   /**
    * @brief 比较两个对象的大小关系（核心方法，需实现类提供具体比较逻辑）
    * @param x [in] 第一个比较对象（类型与泛型参数 T 一致）
    * @param y [in] 第二个比较对象（类型与泛型参数 T 一致）
    * @return int - 比较结果（严格遵循以下标准，确保排序逻辑统一）：
    *               1. 返回 < 0：x < y（x 优先级低于 y，排序时 x 在前）；
    *               2. 返回 = 0：x == y（两个对象在当前比较维度上相等）；
    *               3. 返回 > 0：x > y（x 优先级高于 y，排序时 x 在后）；
    * @note 实现规范与注意事项：
    *       1. 一致性：若 Compare(x, y) 返回 0，则 Compare(y, x) 也必须返回 0；
    *       2. 传递性：若 Compare(x, y) < 0 且 Compare(y, z) < 0，则 Compare(x, z) 必须 < 0；
    *       3. 反对称性：Compare(x, y) 的返回值必须是 Compare(y, x) 返回值的相反数（如 x > y 则 y < x）；
    *       4. 空值处理：若 T 为指针类型，需先判断 x 或 y 是否为 NULL（通常约定 NULL 小于任何非 NULL 对象）；
    *       5. 比较维度明确性：每个实现类应专注于单一比较维度（如“仅按时间比较”“仅按数值比较”），避免混合逻辑。
    */
   int       Compare(T x, T y);
  };
//+------------------------------------------------------------------+